package org.pray.activity.abstractfactory;

/**
 * AbstractFactory
 */

// 参考文章：https://zhuanlan.zhihu.com/p/611870523
// 注意，必须满足以下条件才考虑抽象工厂模式 ：
// 系统中有多个产品族，每个具体工厂创建同一族但属于不同等级结构的产品。系统一次只可能消费其中某一族产品，即同族的产品一起使用。

/**
 * 优点：具体产品在应用层代码隔离，无须关心创建细节；将一个系列的产品族统一到一起创建。
 * 缺点：规定了所有可能被创建的产品集合，产品族中扩展新的产品困难，需要修改抽象工厂的接口；增加了系统的抽象性和理解难度
 */

/**
 * 抽象工厂（Abstract Factory）：提供了创建产品的接口，它包含多个创建产品的方法 newProduct()，可以创建多个不同等级的产品。
 * 具体工厂（Concrete Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。
 * 抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。
 * 具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，它 同具体工厂之间是多对一的关系。
 */

// 另一方面，当系统中只存在一个等级结构的产品时，抽象工厂模式将退化到工厂方法模式。
public abstract class AbstractFactory {

    public abstract Phone getPhone(String name);

    public abstract Table getTable();

    public abstract Router getRouter();
}